package pe.gob.mininter.dirandro.vaadin.panel.informe;

import java.util.Date;
import java.util.List;

import pe.gob.mininter.dirandro.model.Informe;
import pe.gob.mininter.dirandro.model.OrgExhorto;
import pe.gob.mininter.dirandro.model.Persona;
import pe.gob.mininter.dirandro.service.OrganoExhortoService;
import pe.gob.mininter.dirandro.service.PersonaService;
import pe.gob.mininter.dirandro.util.HarecUtil;
import pe.gob.mininter.dirandro.vaadin.dialogs.AlertDialog;
import pe.gob.mininter.dirandro.vaadin.panel.util.PanelSeleccionarEntidad;
import pe.gob.mininter.dirandro.vaadin.util.Injector;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.ui.AbstractSelect.Filtering;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.PopupDateField;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextArea;
import com.vaadin.ui.VerticalLayout;

public class PanelRegistroInformeOrgano extends CustomComponent implements ClickListener {

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private VerticalLayout mainLayout;

	@AutoGenerated
	private Table tblOrgano;

	@AutoGenerated
	private HorizontalLayout horizontalLayout_1;

	@AutoGenerated
	private Button btnAgregar;

	@AutoGenerated
	private TextArea txtObservaciones;

	@AutoGenerated
	private HorizontalLayout horizontalLayout_2;

	@AutoGenerated
	private PopupDateField dtAtencion;

	@AutoGenerated
	private PopupDateField dtSolicitud;

	@AutoGenerated
	private ComboBox cmbPersonaDestino;

	@AutoGenerated
	private PanelSeleccionarEntidad pnlDestino;

	@AutoGenerated
	private PanelSeleccionarEntidad pnlOrigen;

	private Informe informe;	
	private OrgExhorto organoExhorto;
	private OrganoExhortoService organoExhortoService;
	private PersonaService personaService;
 	private IndexedContainer container;
	private List<OrgExhorto> lstOrganos;
	
	public Informe getInforme() {
		return informe;
	}

	public void setInforme(Informe informe) {
		this.informe = informe;
		habilitarEdicion(!informe.esNuevo());
		limpiar();
	}
	
	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 */
	public PanelRegistroInformeOrgano() {
		buildMainLayout();
		setCompositionRoot(mainLayout);
		personaService = Injector.obtenerServicio(PersonaService.class);
		organoExhortoService = Injector.obtenerServicio(OrganoExhortoService.class);
		btnAgregar.addListener(this);
		
		//combo personas
		cmbPersonaDestino.setContainerDataSource(new BeanItemContainer<Persona>(Persona.class,   personaService.buscar(null) ));
		cmbPersonaDestino.setItemCaptionPropertyId("nombreCompleto");
		cmbPersonaDestino.setFilteringMode(Filtering.FILTERINGMODE_CONTAINS);
		cmbPersonaDestino.setImmediate(true);
		
		container = new IndexedContainer();
		container.addContainerProperty("id", Long.class, null);
		container.addContainerProperty("entidadOrigen", String.class, null);
		container.addContainerProperty("entidadDestino", String.class, null);
		container.addContainerProperty("fecSolicitud", Date.class, null);
		container.addContainerProperty("fecAtencion", Date.class, null);
		container.addContainerProperty("persona", Persona.class, null);
		container.addContainerProperty("persona.nombre", String.class, null);
		container.addContainerProperty("observaciones", String.class, null);
		
		
		tblOrgano.setSelectable(true);
		tblOrgano.setImmediate(true);
		tblOrgano.setNullSelectionAllowed(true);
		tblOrgano.setNullSelectionItemId(null);
		tblOrgano.addListener(new ValueChangeListener() {
			
			private static final long serialVersionUID = -3416533772693474159L;

			@Override
			public void valueChange(ValueChangeEvent event) {
				boolean esModoNuevo = tblOrgano.getValue() == null;
				limpiar();
				habilitarEdicion(!esModoNuevo);
				if (!esModoNuevo) {
					Item item = tblOrgano.getItem(tblOrgano.getValue());
					
					organoExhorto.setId((Long) item.getItemProperty("id").getValue());
					cmbPersonaDestino.select( (Persona) item.getItemProperty("persona").getValue() );
					dtAtencion.setValue( (Date) item.getItemProperty("fecAtencion").getValue() );
					dtSolicitud.setValue( (Date) item.getItemProperty("fecSolicitud").getValue() );
					txtObservaciones.setValue(HarecUtil.nullToEmpty(item.getItemProperty("observaciones")));
					//pnlOrigen
					//pnlDestino
				}
			}
		});
		llenarTabla();
		limpiar();

		pnlDestino.soloEntidades();
		pnlOrigen.soloEntidades();
		
	}


	
	@Override
	public void buttonClick(ClickEvent event) {
		if(event.getButton().equals(btnAgregar)) {
			
			organoExhorto.setOrigen(pnlOrigen.getProcedencia());
			organoExhorto.setCodigoOrigen(pnlOrigen.getIdentificador());
			organoExhorto.setDestino(pnlDestino.getProcedencia());
			organoExhorto.setCodigoDestino(pnlDestino.getIdentificador());
			organoExhorto.setFechaSolicitud((Date)dtSolicitud.getValue());
			organoExhorto.setFechaDilingecia((Date)dtAtencion.getValue());
			organoExhorto.setPersonaDestino((Persona)cmbPersonaDestino.getValue());
			organoExhorto.setObservaciones(HarecUtil.nullToEmpty(txtObservaciones.getValue()));
			
			AlertDialog alertDialog = null;
			if(organoExhorto.esNuevo()){
				organoExhortoService.crear(organoExhorto);
				alertDialog = new  AlertDialog("Registro de Organo Exhorto", "Se ha registrado el Organo Exhorto correctamente", "Aceptar", "400");
			}else{
				organoExhortoService.actualizar(organoExhorto);
				alertDialog = new  AlertDialog("Registro de Organo Exhorto", "Se ha actualizado el Organo Exhorto correctamente", "Aceptar", "400");
			}
			getApplication().getMainWindow().addWindow(alertDialog);
			limpiar();
			llenarTabla();
		}
	}
	
	private void llenarTabla(){
		OrgExhorto detorg = new OrgExhorto();
		detorg.setInforme(informe);
		lstOrganos = organoExhortoService.buscar(detorg);
		container.removeAllItems();
		int con=1;
		if ( lstOrganos != null) {
	    	 for (OrgExhorto zona: lstOrganos) {
	             Item item = container.addItem(con++);
	             item.getItemProperty("id").setValue(zona.getId());
	             item.getItemProperty("entidadOrigen").setValue(HarecUtil.valorNombreToEmpty(zona.getOrigen()));
	             item.getItemProperty("entidadDestino").setValue(HarecUtil.valorNombreToEmpty(zona.getDestino()));
	             item.getItemProperty("fecSolicitud").setValue(zona.getFechaSolicitud());
	             item.getItemProperty("fecAtencion").setValue(zona.getFechaDilingecia());
	             item.getItemProperty("persona").setValue(zona.getPersonaDestino());
	             item.getItemProperty("persona.nombre").setValue(zona.getPersonaDestino()!=null?zona.getPersonaDestino().getNombreCompleto():"");
	             item.getItemProperty("observaciones").setValue(zona.getObservaciones());
	        }
	    }
		
		tblOrgano.setContainerDataSource(container);
		tblOrgano.setVisibleColumns(new Object[]{"id","entidadOrigen","entidadDestino","persona.nombre","fecSolicitud","fecAtencion"});		
	}
	
	public void limpiar(){
		organoExhorto = new OrgExhorto();
		organoExhorto.setInforme(informe);
		
		dtAtencion.setValue(null);
		dtSolicitud.setValue(null);
		cmbPersonaDestino.select(null);
		txtObservaciones.setValue("");
		pnlOrigen.limpiar();
		pnlDestino.limpiar();
	}
	
	private void habilitarEdicion(boolean flag){
		if(flag){
			btnAgregar.setCaption("Actualizar Organo Exhorto");
		}
		else{
			btnAgregar.setCaption("Crear Organo Exhorto");
		}
	}
	
	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("-1px");
		mainLayout.setMargin(true);
		mainLayout.setSpacing(true);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("-1px");
		
		// pnlOrigen
		pnlOrigen = new PanelSeleccionarEntidad();
		pnlOrigen.setImmediate(false);
		pnlOrigen.setWidth("-1px");
		pnlOrigen.setHeight("-1px");
		mainLayout.addComponent(pnlOrigen);
		
		// pnlDestino
		pnlDestino = new PanelSeleccionarEntidad();
		pnlDestino.setImmediate(false);
		pnlDestino.setWidth("-1px");
		pnlDestino.setHeight("-1px");
		mainLayout.addComponent(pnlDestino);
		
		// cmbPersonaDestino
		cmbPersonaDestino = new ComboBox();
		cmbPersonaDestino.setCaption("Funcionario de Destino");
		cmbPersonaDestino.setImmediate(false);
		cmbPersonaDestino.setWidth("250px");
		cmbPersonaDestino.setHeight("-1px");
		mainLayout.addComponent(cmbPersonaDestino);
		
		// horizontalLayout_2
		horizontalLayout_2 = buildHorizontalLayout_2();
		mainLayout.addComponent(horizontalLayout_2);
		
		// txtObservaciones
		txtObservaciones = new TextArea();
		txtObservaciones.setCaption("Observaciones");
		txtObservaciones.setImmediate(false);
		txtObservaciones.setWidth("750px");
		txtObservaciones.setHeight("-1px");
		txtObservaciones.setInputPrompt("Observaciones");
		mainLayout.addComponent(txtObservaciones);
		
		// horizontalLayout_1
		horizontalLayout_1 = buildHorizontalLayout_1();
		mainLayout.addComponent(horizontalLayout_1);
		
		// tblOrgano
		tblOrgano = new Table();
		tblOrgano.setImmediate(false);
		tblOrgano.setWidth("750px");
		tblOrgano.setHeight("200px");
		mainLayout.addComponent(tblOrgano);
		
		return mainLayout;
	}

	@AutoGenerated
	private HorizontalLayout buildHorizontalLayout_2() {
		// common part: create layout
		horizontalLayout_2 = new HorizontalLayout();
		horizontalLayout_2.setImmediate(false);
		horizontalLayout_2.setWidth("-1px");
		horizontalLayout_2.setHeight("-1px");
		horizontalLayout_2.setMargin(false);
		horizontalLayout_2.setSpacing(true);
		
		// dtSolicitud
		dtSolicitud = new PopupDateField();
		dtSolicitud.setCaption("Fecha de Solicitud");
		dtSolicitud.setImmediate(false);
		dtSolicitud.setWidth("150px");
		dtSolicitud.setHeight("-1px");
		dtSolicitud.setResolution(4);
		horizontalLayout_2.addComponent(dtSolicitud);
		
		// dtAtencion
		dtAtencion = new PopupDateField();
		dtAtencion.setCaption("Fecha de atención");
		dtAtencion.setImmediate(false);
		dtAtencion.setWidth("150px");
		dtAtencion.setHeight("-1px");
		dtAtencion.setResolution(4);
		horizontalLayout_2.addComponent(dtAtencion);
		
		return horizontalLayout_2;
	}

	@AutoGenerated
	private HorizontalLayout buildHorizontalLayout_1() {
		// common part: create layout
		horizontalLayout_1 = new HorizontalLayout();
		horizontalLayout_1.setImmediate(false);
		horizontalLayout_1.setWidth("100.0%");
		horizontalLayout_1.setHeight("-1px");
		horizontalLayout_1.setMargin(false);
		
		// btnAgregar
		btnAgregar = new Button();
		btnAgregar.setCaption("Agregar");
		btnAgregar.setImmediate(true);
		btnAgregar.setWidth("-1px");
		btnAgregar.setHeight("-1px");
		horizontalLayout_1.addComponent(btnAgregar);
		horizontalLayout_1.setComponentAlignment(btnAgregar, new Alignment(20));
		
		return horizontalLayout_1;
	}

}
